home *** CD-ROM | disk | FTP | other *** search
/ Sprite 1984 - 1993 / Sprite 1984 - 1993.iso / src / machserver / 1.098 / mach / ds3100.md / compatSig.c < prev    next >
C/C++ Source or Header  |  1990-06-26  |  5KB  |  228 lines

  1. /*
  2.  * compatSig.c --
  3.  *
  4.  *     Returns the Sprite signal number corresponding to a Unix signal.
  5.  *
  6.  * Copyright (C) 1986 Regents of the University of California
  7.  * All rights reserved.
  8.  *
  9.  */
  10.  
  11. #ifndef lint
  12. static char rcsid[] = "$Header: /sprite/src/kernel/mach/ds3100.md/RCS/compatSig.c,v 9.2 90/06/26 19:01:06 douglis Exp $ SPRITE (Berkeley)";
  13. #endif not lint
  14.  
  15. #include "sprite.h"
  16.  
  17. #ifndef NULL
  18. #define NULL 0
  19. #endif
  20.  
  21. #include "compatInt.h"
  22. #include "user/sig.h"
  23. #include "user/sys/signal.h"
  24. #include "machInt.h"
  25. #include "mach.h"
  26.  
  27. #include "compatSig.h"
  28.  
  29.  
  30. /*
  31.  *----------------------------------------------------------------------
  32.  *
  33.  * Compat_UnixSignalToSprite --
  34.  *
  35.  *    Given a Unix signal, return the closest corresponding Sprite signal
  36.  *    number. Signal 0 is special-cased to map to sprite signal 0 (NULL).
  37.  *    Some programs use kill(pid, 0) to see if pid exists....
  38.  *
  39.  * Results:
  40.  *    A Sprite signal number is returned, assuming the Unix signal is
  41.  *    in a valid range.  Note that the Sprite "signal number" may be
  42.  *    NULL (0) if there's no matching signal.
  43.  *
  44.  * Side effects:
  45.  *    None.
  46.  *
  47.  *----------------------------------------------------------------------
  48.  */
  49.  
  50. ReturnStatus
  51. Compat_UnixSignalToSprite(signal, spriteSigPtr)
  52.     int signal;
  53.     int *spriteSigPtr;
  54. {
  55.     if (signal >= 0 && signal <= NSIG) {
  56.     *spriteSigPtr = compat_UnixSigToSprite[signal];
  57.     return(SUCCESS);
  58.     } else {
  59.     return(FAILURE);
  60.     }
  61. }
  62.  
  63.  
  64. /*
  65.  *----------------------------------------------------------------------
  66.  *
  67.  * Compat_SpriteSignalToUnix --
  68.  *
  69.  *    Given a Sprite signal, return the closest corresponding Unix signal
  70.  *    number.
  71.  *
  72.  * Results:
  73.  *    A Unix signal number is returned, assuming the Sprite signal is
  74.  *    in a valid range. 
  75.  *
  76.  * Side effects:
  77.  *    None.
  78.  *
  79.  *----------------------------------------------------------------------
  80.  */
  81. ReturnStatus
  82. Compat_SpriteSignalToUnix(signal, unixSigPtr)
  83.     int signal;
  84.     int *unixSigPtr;
  85. {
  86.     if (signal >= 0 && signal <= SIG_NUM_SIGNALS) {
  87.     *unixSigPtr = spriteToUnix[signal];
  88.     return(SUCCESS);
  89.     } else {
  90.     return(FAILURE);
  91.     }
  92. }
  93.  
  94.  
  95. /*
  96.  *----------------------------------------------------------------------
  97.  *
  98.  *  Compat_UnixSigMaskToSprite --
  99.  *
  100.  *    Given a Unix signal mask, return the corresponding Sprite signal
  101.  *    mask.
  102.  *
  103.  * Results:
  104.  *    A Sprite signal mask is returned, assuming the Unix signal mask is
  105.  *    valid.
  106.  *
  107.  * Side effects:
  108.  *    None.
  109.  *
  110.  *----------------------------------------------------------------------
  111.  */
  112.  
  113. ReturnStatus
  114. Compat_UnixSigMaskToSprite(unixMask, spriteMaskPtr)
  115.     int unixMask;
  116.     int *spriteMaskPtr;
  117. {
  118.     int i;
  119.     int signal;
  120.     ReturnStatus status;
  121.  
  122.     *spriteMaskPtr = 0;
  123.     for (i = 1; i <= NSIG; i++) {
  124.     if (unixMask & (1 << (i - 1))) {
  125.         status = Compat_UnixSignalToSprite(i, &signal);
  126.         if (status == FAILURE) {
  127.         return(FAILURE);
  128.         }
  129.         if (signal != NULL) {
  130.         *spriteMaskPtr |= 1 << (signal - 1);
  131.         }
  132.     }
  133.     }
  134. #ifdef COMPAT_DEBUG
  135.     printf("Unix mask = <%x> Sprite mask = <%x>\n", 
  136.         unixMask, *spriteMaskPtr);
  137. #endif
  138.     return(SUCCESS);
  139. }
  140.  
  141.  
  142. /*
  143.  *----------------------------------------------------------------------
  144.  *
  145.  * Compat_SpriteSigMaskToUnix --
  146.  *
  147.  *    Given a Sprite signal mask, return the corresponding Unix signal
  148.  *    mask.
  149.  *
  150.  * Results:
  151.  *    A Unix signal mask is returned, assuming the Sprite signal mask is
  152.  *    valid.
  153.  *
  154.  * Side effects:
  155.  *    None.
  156.  *
  157.  *----------------------------------------------------------------------
  158.  */
  159.  
  160. ReturnStatus
  161. Compat_SpriteSigMaskToUnix(SpriteMask, UnixMaskPtr)
  162.     int SpriteMask;
  163.     int *UnixMaskPtr;
  164. {
  165.     int i;
  166.     int signal;
  167.     ReturnStatus status;
  168.  
  169.     *UnixMaskPtr = 0;
  170.     for (i = 1; i <= SIG_NUM_SIGNALS; i++) {
  171.     if (SpriteMask & (1 << (i - 1))) {
  172.         status = Compat_SpriteSignalToUnix(i, &signal);
  173.         if (status == FAILURE) {
  174.         return(FAILURE);
  175.         }
  176.         if (signal != NULL) {
  177.         *UnixMaskPtr |= 1 << (signal - 1);
  178.         }
  179.     }
  180.     }
  181.     return(SUCCESS);
  182. }
  183.  
  184.  
  185. /*
  186.  *----------------------------------------------------------------------
  187.  *
  188.  * Compat_GetSigHoldMask --
  189.  *
  190.  *    Return the current signal mask.
  191.  *
  192.  * Results:
  193.  *    The current signal mask (in Sprite terms) is returned.
  194.  *
  195.  * Side effects:
  196.  *    None.
  197.  *
  198.  *----------------------------------------------------------------------
  199.  */
  200.  
  201. #define MASK_ALL_SIGNALS 0xFFFFFFFF
  202.  
  203. ReturnStatus
  204. Compat_GetSigHoldMask(maskPtr)
  205.     int *maskPtr;
  206. {
  207.     ReturnStatus status;
  208.     Address    usp;
  209.     extern Mach_State    *machCurStatePtr;
  210.  
  211.     /*
  212.      * To modify the hold mask we need to get the old one by
  213.      * calling Sig_SetHoldMask to get the current mask.  Since we
  214.      * don't know what to set the mask to, set the mask to mask ALL 
  215.      * signals and then reset it again to the proper value.
  216.      */
  217.  
  218.     usp = (Address) (machCurStatePtr->userState.regState.regs[SP] - 4);
  219.  
  220.     status = Sig_SetHoldMask((int) MASK_ALL_SIGNALS, (int *) usp);
  221.     if (status != SUCCESS) {
  222.     return(status);
  223.     }
  224.     (void)Vm_CopyIn(sizeof(int), usp, (Address) maskPtr);
  225.     status = Sig_SetHoldMask(*maskPtr, (int *) NULL);
  226.     return(status);
  227. }
  228.